/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Persistencia.JPAControllers;

import Logica.Core.PersonaLegal.ART;
import java.io.Serializable;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import Logica.Core.Personal.Equipamiento;
import Persistencia.JPAControllers.exceptions.NonexistentEntityException;
import Persistencia.JPAControllers.exceptions.PreexistingEntityException;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

/**
 *
 * @author Luciano
 */
public class ARTJpaController implements Serializable {

    public ARTJpaController(EntityManagerFactory emf) {
        this.emf = emf;
    }
    private EntityManagerFactory emf = null;

    public ARTJpaController() {
        emf = Persistence.createEntityManagerFactory("SecaderoPU");

    }

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(ART ART) throws PreexistingEntityException, Exception {
        if (ART.getMisEquipamientos() == null) {
            ART.setMisEquipamientos(new ArrayList<Equipamiento>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            List<Equipamiento> attachedMisEquipamientos = new ArrayList<Equipamiento>();
            for (Equipamiento misEquipamientosEquipamientoToAttach : ART.getMisEquipamientos()) {
                misEquipamientosEquipamientoToAttach = em.getReference(misEquipamientosEquipamientoToAttach.getClass(), misEquipamientosEquipamientoToAttach.getNro());
                attachedMisEquipamientos.add(misEquipamientosEquipamientoToAttach);
            }
            ART.setMisEquipamientos(attachedMisEquipamientos);
            em.persist(ART);
            for (Equipamiento misEquipamientosEquipamiento : ART.getMisEquipamientos()) {
                ART oldMiARTOfMisEquipamientosEquipamiento = misEquipamientosEquipamiento.getMiART();
                misEquipamientosEquipamiento.setMiART(ART);
                misEquipamientosEquipamiento = em.merge(misEquipamientosEquipamiento);
                if (oldMiARTOfMisEquipamientosEquipamiento != null) {
                    oldMiARTOfMisEquipamientosEquipamiento.getMisEquipamientos().remove(misEquipamientosEquipamiento);
                    oldMiARTOfMisEquipamientosEquipamiento = em.merge(oldMiARTOfMisEquipamientosEquipamiento);
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findART(ART.getCuil()) != null) {
                throw new PreexistingEntityException("ART " + ART + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(ART ART) throws NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            ART persistentART = em.find(ART.class, ART.getCuil());
            List<Equipamiento> misEquipamientosOld = persistentART.getMisEquipamientos();
            List<Equipamiento> misEquipamientosNew = ART.getMisEquipamientos();
            List<Equipamiento> attachedMisEquipamientosNew = new ArrayList<Equipamiento>();
            for (Equipamiento misEquipamientosNewEquipamientoToAttach : misEquipamientosNew) {
                misEquipamientosNewEquipamientoToAttach = em.getReference(misEquipamientosNewEquipamientoToAttach.getClass(), misEquipamientosNewEquipamientoToAttach.getNro());
                attachedMisEquipamientosNew.add(misEquipamientosNewEquipamientoToAttach);
            }
            misEquipamientosNew = attachedMisEquipamientosNew;
            ART.setMisEquipamientos(misEquipamientosNew);
            ART = em.merge(ART);
            for (Equipamiento misEquipamientosOldEquipamiento : misEquipamientosOld) {
                if (!misEquipamientosNew.contains(misEquipamientosOldEquipamiento)) {
                    misEquipamientosOldEquipamiento.setMiART(null);
                    misEquipamientosOldEquipamiento = em.merge(misEquipamientosOldEquipamiento);
                }
            }
            for (Equipamiento misEquipamientosNewEquipamiento : misEquipamientosNew) {
                if (!misEquipamientosOld.contains(misEquipamientosNewEquipamiento)) {
                    ART oldMiARTOfMisEquipamientosNewEquipamiento = misEquipamientosNewEquipamiento.getMiART();
                    misEquipamientosNewEquipamiento.setMiART(ART);
                    misEquipamientosNewEquipamiento = em.merge(misEquipamientosNewEquipamiento);
                    if (oldMiARTOfMisEquipamientosNewEquipamiento != null && !oldMiARTOfMisEquipamientosNewEquipamiento.equals(ART)) {
                        oldMiARTOfMisEquipamientosNewEquipamiento.getMisEquipamientos().remove(misEquipamientosNewEquipamiento);
                        oldMiARTOfMisEquipamientosNewEquipamiento = em.merge(oldMiARTOfMisEquipamientosNewEquipamiento);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                String id = ART.getCuil();
                if (findART(id) == null) {
                    throw new NonexistentEntityException("The aRT with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(String id) throws NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            ART ART;
            try {
                ART = em.getReference(ART.class, id);
                ART.getCuil();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The ART with id " + id + " no longer exists.", enfe);
            }
            List<Equipamiento> misEquipamientos = ART.getMisEquipamientos();
            for (Equipamiento misEquipamientosEquipamiento : misEquipamientos) {
                misEquipamientosEquipamiento.setMiART(null);
                misEquipamientosEquipamiento = em.merge(misEquipamientosEquipamiento);
            }
            em.remove(ART);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<ART> findARTEntities() {
        return findARTEntities(true, -1, -1);
    }

    public List<ART> findARTEntities(int maxResults, int firstResult) {
        return findARTEntities(false, maxResults, firstResult);
    }

    private List<ART> findARTEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select object(o) from ART as o");
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public ART findART(String id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(ART.class, id);
        } finally {
            em.close();
        }
    }

    public int getARTCount() {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select count(o) from ART as o");
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
}
